<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
    // 单例模式
    // 就是使用构造函数实例化的时候，不管实例化多少回，都是同一个对象
    // 也就是一个构造函数一生只能 new 出一个对象
    // 也就是说，当我们使用构造函数，每一次 new 出来的对象 属性/功能/方法 完全一样 的时候，我们把他设计成单例模式

    // 其实就是判断一下，他曾经有没有 new 出来过对象
    // 如果有，就还继续使用之前的那个对象，如果没有，那么就给你 new 一个

    // 宠物
    function Pet(name,age,species){
        this.name = name;
        this.age = age;
        this.species = species;
    }
    Pet.prototype.init = function(name,age,species){
        // this -> 调用此方法的实例化对象
        this.name = name;
        this.age = age;
        this.species = species;
    }
  

    // 单例封装  => 传入一个构造函数,将其转化为单例模式
    function singleton(fn){  // 要求接收一个函数作为构造函数
        var instance = null;
        return function(){
            if(!instance){
                instance = new fn(...arguments);
            }
            return instance;
        }
    }

    var GamePet = singleton(Pet);  // 调用此方法返回新函数

    var res1 = GamePet("Tom",2,"Cat");
    console.log(res1);

    var res2 = GamePet("WangCai",3,"Dog");
    res2.init("WangCai",3,"Dog"); 
    console.log(res2);
    console.log(res1 === res2);



</script>
</html>